/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */
package com.ztewatch.wearcontacts.loader;

import android.content.Context;
import android.content.CursorLoader;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.provider.ContactsContract.Groups;

import com.ztewatch.wearcontacts.R;

/**
 * Group meta-data loader. Loads all groups or just a single group from the
 * database (if given a {@link Uri}).
 */
public final class GroupMetaDataAddLoader extends CursorLoader {

	public final static String[] COLUMNS = new String[] { Groups.ACCOUNT_NAME,
			Groups.ACCOUNT_TYPE, Groups.DATA_SET, Groups._ID, Groups.TITLE,
			Groups.AUTO_ADD, Groups.FAVORITES, Groups.GROUP_IS_READ_ONLY,
			Groups.DELETED, Groups.SUMMARY_COUNT};
	private Context mContext;
	public final static int ACCOUNT_NAME = 0;
	public final static int ACCOUNT_TYPE = 1;
	public final static int DATA_SET = 2;
	public final static int GROUP_ID = 3;
	public final static int TITLE = 4;
	public final static int AUTO_ADD = 5;
	public final static int FAVORITES = 6;
	public final static int IS_READ_ONLY = 7;
	public final static int DELETED = 8;
	public final static int MEMBER_COUNT = 9;
	private static final Uri GROUP_LIST_URI = Groups.CONTENT_SUMMARY_URI;
	public GroupMetaDataAddLoader(Context context, Uri groupUri) {
//		super(context, ensureIsGroupUri(groupUri), COLUMNS, Groups.ACCOUNT_TYPE
//				+ " NOT NULL AND " + Groups.ACCOUNT_NAME + " NOT NULL AND "
//				+ Groups.DELETED + "=0 ", null, null);
		super(context, GROUP_LIST_URI, COLUMNS, Groups.ACCOUNT_TYPE
				+ " NOT NULL AND " + Groups.ACCOUNT_NAME + " NOT NULL AND "
				+ Groups.AUTO_ADD + "=0 AND " + Groups.FAVORITES + "=0 AND "
				+ Groups.DELETED + "=0", null, Groups.ACCOUNT_TYPE + ", "
				+ Groups.ACCOUNT_NAME + ", " + Groups.DATA_SET + ", "
				+ Groups.TITLE + " COLLATE LOCALIZED ASC");
		mContext = context;
	}

	/**
	 * Ensures that this is a valid group URI. If invalid, then an exception is
	 * thrown. Otherwise, the original URI is returned.
	 */
	private static Uri ensureIsGroupUri(final Uri groupUri) {
		// TODO: Fix ContactsProvider2 getType method to resolve the group Uris
		if (groupUri == null) {
			throw new IllegalArgumentException("Uri must not be null");
		}
		if (!groupUri.toString().startsWith(Groups.CONTENT_URI.toString())) {
			throw new IllegalArgumentException("Invalid group Uri: " + groupUri);
		}
		return groupUri;
	}

	@Override
	public Cursor loadInBackground() {
		Cursor cursor = null;
		try {
			cursor = super.loadInBackground();
		} catch (NullPointerException e) {
		}

		try {
			MatrixCursor matrix = new MatrixCursor(GroupMetaDataLoader.COLUMNS);
			Object[] row = new Object[GroupMetaDataLoader.COLUMNS.length];
			while (cursor.moveToNext()) {
				for (int i = 0; i < row.length; i++) {
					row[i] = cursor.getString(i);
				}
				matrix.addRow(row);
			}
			Object[] addGroup = new Object[GroupMetaDataLoader.COLUMNS.length];
			for (int i = 0; i < addGroup.length; i++) {
				if (Groups.TITLE.equals(GroupMetaDataLoader.COLUMNS[i])) {
					addGroup[i] = mContext.getString(R.string.new_folder_str);
				}
			}
			matrix.addRow(addGroup);
			return matrix;
		} finally {
			cursor.close();
		}
	}
}
